home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BIRTHSRC.ZIP / BIRTHDAY.ASM next >
Assembly Source File  |  1993-11-23  |  16KB  |  846 lines

  1. ;╔═════════════════════════════════════════════════╗
  2. ;║  Name:Electronic_Birthday_Cake________  V01.10  ║
  3. ;║                                                 ║
  4. ;║     Date:23-Nov-93                ║
  5. ;║                                                 ║
  6. ;║ Copyright (C) 1993 by F.Becker aka -=* SliQ *=- ║
  7. ;╚═════════════════════════════════════════════════╝
  8. ;
  9. ;Normal Assembly Program Header
  10. ; (Simplified Segment Definitions)
  11.  
  12. MaxPts          EQU     1146
  13.  
  14.  DOSSEG
  15. ;**************************************************
  16. .MODEL Compact
  17. .386
  18. ;**************************************************
  19. .STACK 100h
  20. ;**************************************************
  21. .DATA
  22.  
  23. ;Sines and cosines used in rotations
  24. Xsin            dd 0
  25. Xcos            dd 0
  26. Ysin            dd 0
  27. Ycos            dd 0
  28. Zsin            dd 0
  29. Zcos            dd 0
  30.  
  31. palblack        db 3*256 DUP (0)        ;
  32. palwhite        db 3*256 DUP (63)       ;
  33. pal2            db 3*256 DUP (0)        ;
  34. pal3            db 3*256 DUP (0)        ;
  35.  
  36. eyeposX         dd 0
  37. eyeposY         dd 0
  38. eyeposZ         dd 0
  39.  
  40. lookatX         dd 0
  41. lookatY         dd 0
  42. lookatZ         dd 0
  43.  
  44. VRCount         dw 0
  45. FrameReady      dw 0
  46. Frame           dw 0
  47. PalChanged      dw 0
  48.  
  49. ClearColor      db 0
  50. WriteOffset     dw 0
  51. CurrPage        dw 0
  52. NextPage        dw 19200
  53. ClipMinX        dw 1
  54. ClipMinY        dw 1
  55. ClipMaxX        dw 319
  56. ClipMaxY        dw 239
  57.  
  58. deg1            dw 0
  59. deg2            dw 40
  60.  
  61. ;**************************************************
  62. .FARDATA @dataseg2
  63.  
  64. xtmp            dd 0
  65. ytmp            dd 0
  66. ztmp            dd 0
  67.  
  68. dispptr         dw offset starbuff1
  69. clearptr        dw offset starbuff2
  70. staroffset      dw 0
  71.         dw 1*MaxPts
  72.         dw 2*MaxPts
  73.         dw 3*MaxPts
  74.  
  75. sphere          dd 3*MaxPts DUP (0)
  76. bday            dd 3*MaxPts DUP (0)
  77. deltas          dd 3*MaxPts DUP (0)
  78.  
  79. colors          db MaxPts DUP (0)
  80.         db MaxPts DUP (0)
  81.         db MaxPts DUP (0)
  82.         db MaxPts DUP (0)
  83.  
  84. starbuff1       dw MaxPts DUP (0)
  85.         dw MaxPts DUP (0)
  86.         dw MaxPts DUP (0)
  87.         dw MaxPts DUP (0)
  88.  
  89. starbuff2       dw MaxPts DUP (0)
  90.         dw MaxPts DUP (0)
  91. INCLUDE Birthday.inc        ;the arrays in birthday.inc are part of starbuff2!
  92.  
  93. ;**************************************************
  94. .FARDATA @dataseg3
  95.  
  96. ;**************************************************
  97. .CODE
  98.  
  99. INCLUDE ModeX.inc
  100. INCLUDE Fixed.inc
  101. INCLUDE Random.inc
  102. INCLUDE IntMisc.inc
  103.  
  104. ;--------------------------------------------------
  105. main      proc      ;main part of program
  106.  
  107. ASSUME  gs:@dataseg2
  108. ASSUME  fs:@dataseg3
  109.  
  110. start:
  111.     Call    DisableKbd
  112.  
  113.     ;set up datasegments
  114.     mov     ax,@data
  115.     mov     ds,ax
  116.     mov     ax,@dataseg2
  117.     mov     gs,ax
  118.     mov     ax,@dataseg3
  119.     mov     fs,ax
  120.     mov     ax,0a000h
  121.     mov     es,ax
  122.  
  123.     ; Fade to Black!
  124.     mov     si,offset palblack
  125.     mov     ax,200h
  126.     mov     cx,256
  127.     Call    FadeIn
  128.  
  129.     Call    InitPalette
  130.     Call    Scron
  131.  
  132.     mov     si,offset pal2
  133.     mov     al,0
  134.     mov     cx,256
  135.     Call    SetPal
  136.  
  137.     ;reorganize 'Happy Birthday' data
  138.     Call    MakeBirthday
  139.     ;create sphere points
  140.     Call    MakeSphere
  141.  
  142.     mov     ax,NextPage
  143.     Call    SetPage
  144.     mov     ax,CurrPage
  145.     Call    ShowPage
  146.     mov     ax,CurrPage
  147.     xchg    ax,NextPage
  148.     mov     CurrPage,ax
  149.  
  150.     ;set up interrupts
  151.     Call    SetINT9
  152.     Call    SetINT8
  153.  
  154. main1:
  155.     ;calc new eyeposition and lookat
  156.     Call    CalcEye
  157.     ;rotate and draw
  158.     Call    DrawPoints
  159.  
  160.     ;change page - will take effect next VR
  161.     mov     ax,CurrPage
  162.     Call    ShowPage
  163.     inc     FrameReady
  164.  
  165. main2:  ;synchronize with timer
  166.     cmp     FrameReady,0
  167.     jne     main2
  168.  
  169.     mov     ax,NextPage
  170.     Call    SetPage
  171.     mov     ax,NextPage
  172.     xchg    ax,CurrPage
  173.     mov     NextPage,ax
  174.  
  175.     ; clear points on other page
  176.     Call    ClearPoints
  177.  
  178.     mov     ax,dispptr
  179.     xchg    ax,clearptr
  180.     mov     dispptr,ax
  181.  
  182.     ;NOTE : transformations are still CPU-speed dependent
  183.     ;    (it'll always take 32 frames to transform)
  184.     ;       I was to lazy to fix this. Maybe you would
  185.     ;    like to get frustrated over this |-)
  186.     mov     ax,Frame
  187.     and     ax,1ffh
  188.     cmp     ax,112
  189.     jle     main4
  190.     cmp     ax,144
  191.     jg      main3
  192.     Call    Transform1
  193.     jmp     short main4
  194. main3:
  195.     cmp     ax,368
  196.     jle     main4
  197.     cmp     ax,400
  198.     jg      main4
  199.     Call    Transform2
  200. main4:
  201.  
  202.     inc     Frame
  203.     in      al,60h
  204.     dec     al          ;someone hugged ESC?
  205.     jz      main6
  206.     jmp     main1
  207.  
  208. main6:
  209.     ; Fade White!
  210.     mov     si,offset palwhite
  211.     mov     ax,0a00h    ;fade towards white - fast
  212.     mov     cx,256
  213.     Call    FadeIn
  214.  
  215.     ; Fade   Out!
  216.     mov     si,offset palblack
  217.     mov     ax,0400h    ;fade towards black - medium speed
  218.     mov     cx,256
  219.     Call    FadeIn
  220.  
  221.     ; get those old int vectors back in place
  222.     Call    RestoreINT8
  223.     Call    RestoreINT9
  224.  
  225.     Call    Scroff
  226.  
  227.     Call    EnableKbd
  228.  
  229.     ;back to DOS
  230.     mov     ax,4c00h
  231.     int     21h
  232.  
  233. main      endp
  234. ;--------------------------------------------------
  235. ;called every VR - from INT8handler
  236. HouseKeeper   PROC
  237.  
  238.     pusha
  239.     inc     VRCount
  240.  
  241.     mov     FrameReady,0
  242.  
  243.     add    deg1,3
  244.     add    deg2,2
  245.     popa
  246.     ret
  247.  
  248. HouseKeeper   ENDP
  249. ;--------------------------------------------------
  250.  
  251. MakeSphere      PROC
  252.  
  253.     xor     di,di
  254. makesp1:
  255.     Call    CalcSphere
  256.  
  257.     mov     eax,xtmp
  258.     mov     sphere[di],eax
  259.     mov     ebx,bday[di]
  260.     sub     ebx,eax
  261.     sar     ebx,5
  262.     mov     deltas[di],ebx
  263.  
  264.     mov     eax,ytmp
  265.     mov     sphere[di+4],eax
  266.     mov     ebx,bday[di+4]
  267.     sub     ebx,eax
  268.     sar     ebx,5
  269.     mov     deltas[di+4],ebx
  270.  
  271.     mov     eax,ztmp
  272.     mov     sphere[di+8],eax
  273.     mov     ebx,bday[di+8]
  274.     sub     ebx,eax
  275.     sar     ebx,5
  276.     mov     deltas[di+8],ebx
  277.  
  278.     add     di,12
  279.     cmp     di,12*(MaxPts-1)
  280.     jle     makesp1
  281.  
  282. MakeSphere      ENDP
  283.  
  284. ; modifies  : eax,ebx,ecx,edx,si
  285. CalcSphere  PROC
  286.  
  287.     mov     ecx,4096
  288.  
  289.     Call    Random
  290.     xor     edx,edx
  291.     div     ecx
  292.     mov     xtmp,edx
  293.  
  294.     sub     ecx,edx
  295.     Call    Random
  296.     xor     edx,edx
  297.     div     ecx
  298.     mov     ytmp,edx
  299.  
  300.     sub     ecx,edx
  301.     mov     ztmp,ecx
  302.  
  303.     mov     ecx,xtmp
  304.     shl     ecx,14
  305.     Call    Sqrt
  306.     mov     xtmp,eax
  307.  
  308.     mov     ecx,ytmp
  309.     shl     ecx,14
  310.     Call    Sqrt
  311.     mov     ytmp,eax
  312.  
  313.     mov     ecx,ztmp
  314.     shl     ecx,14
  315.     Call    Sqrt
  316.     mov     ztmp,eax
  317.  
  318.     Call    Random
  319.  
  320.     test    ax,1
  321.     jz      noneg1
  322.     neg     xtmp
  323. noneg1:
  324.  
  325.     test    ax,2
  326.     jz      noneg2
  327.     neg     ytmp
  328. noneg2:
  329.  
  330.     test    ax,4
  331.     jz      noneg3
  332.     neg     ztmp
  333. noneg3:
  334.  
  335.     ret
  336.  
  337. CalcSphere  ENDP
  338. ;--------------------------------------------------
  339. MakeBirthday PROC
  340.  
  341.     xor     si,si
  342.     xor     ebx,ebx
  343.  
  344.     mov     cx,MaxPts
  345. MBir1:
  346.     xor     eax,eax
  347.     mov     ax,oldstars1[ebx]
  348.     sub     ax,150
  349.     cwde
  350.     shl     eax,16
  351.     mov     dword ptr bday[si],eax
  352.     add     si,4
  353.  
  354.     xor     eax,eax
  355.     mov     ax,oldstars2[ebx]
  356.     sub     ax,55
  357.     cwde
  358.     shl     eax,16
  359.     mov     dword ptr bday[si],eax
  360.     add     si,8
  361.     add     ebx,2
  362.     loop    MBir1
  363.  
  364.     ret
  365.  
  366. MakeBirthday ENDP
  367. ;--------------------------------------------------
  368. CalcEye         PROC
  369.  
  370.     ;calc eye position
  371.     mov     bx,deg1
  372.     Call    Sin
  373.     shl     eax,6
  374.     mov     ebx,12*(750)
  375.     add     eax,sphere[ebx]
  376.     mov     eyeposX,eax
  377.  
  378.     mov     bx,deg2
  379.     Call    Cos
  380.     shl     eax,5
  381.        ;mov     ebx,12*(750)+4
  382.     sub    eax,65536*20
  383.        ;add     eax,sphere[ebx]
  384.     mov     eyeposZ,eax
  385.  
  386.     mov     bx,deg1
  387.     add     bx,50
  388.     Call    Cos
  389.     shl     eax,6
  390.     neg     eax
  391.     mov     eyeposY,eax
  392.  
  393.     ;calc lookat (currently looking at point 750 which
  394.     ;is part of the D in 'happy birthDay'
  395.     mov     ebx,12*(750)
  396.     mov     eax,sphere[ebx]
  397.     sub     eax,eyeposX
  398.     sar     eax,7
  399.     mov     lookatX,eax
  400.  
  401.     mov     ebx,12*(750)+4
  402.     mov     eax,sphere[ebx]
  403.     sub     eax,eyeposY
  404.     sar     eax,7
  405.     mov     lookatY,eax
  406.  
  407.     mov     ebx,12*(750)+8
  408.     mov     eax,sphere[ebx]
  409.     sub     eax,eyeposZ
  410.     sar     eax,7
  411.     mov     lookatZ,eax
  412.  
  413.     ;calc sines and cosines for X and Y rotations
  414.     mov     eax,lookatX
  415.     imul    lookatX
  416.     add     eax,8000h
  417.     adc     edx,0
  418.     shrd    eax,edx,16
  419.     mov     ecx,eax
  420.  
  421.     mov     eax,lookatZ
  422.     imul    lookatZ
  423.     add     eax,8000h
  424.     adc     edx,0
  425.     shrd    eax,edx,16      ;                  2         2         2
  426.     add     ecx,eax         ;ecx is (distance1) = lookatX + lookatZ
  427.  
  428.     mov     eax,lookatY
  429.     imul    lookatY
  430.     add     eax,8000h
  431.     adc     edx,0
  432.     shrd    eax,edx,16      ;                  2       2         2
  433.     add     eax,ecx         ;eax is (distance2) = dist1 + lookatY
  434.  
  435.     push    eax
  436.     Call    Sqrt
  437.     mov     ebx,eax         ;eax is dist1
  438.     mov     edx,lookatX
  439.     xor     eax,eax
  440.     shrd    eax,edx,16
  441.     sar     edx,16
  442.     idiv    ebx
  443.     mov     Ysin,eax        ;sin = lookatX/dist1
  444.  
  445.     mov     edx,lookatZ
  446.     xor     eax,eax
  447.     shrd    eax,edx,16
  448.     sar     edx,16
  449.     idiv    ebx
  450.     mov     Ycos,eax
  451.     pop     ecx             ;cos = lookatZ/dist1
  452.  
  453.     push    ebx
  454.     Call    Sqrt
  455.     mov     ebx,eax         ;eax is dist2
  456.     mov     edx,lookatY
  457.     xor     eax,eax
  458.     shrd    eax,edx,16
  459.     sar     edx,16
  460.     idiv    ebx
  461.     mov     Xsin,eax        ;sin = lookatY/dist2
  462.  
  463.     pop     edx             ;edx = dist1
  464.     xor     eax,eax
  465.     shrd    eax,edx,16
  466.     sar     edx,16
  467.     idiv    ebx
  468.     mov     Xcos,eax        ;cos = dist1/dist2
  469.  
  470.     ret
  471.  
  472. CalcEye         ENDP
  473. ;--------------------------------------------------
  474. InitPalette PROC
  475.  
  476.     xor     bx,bx
  477.     mov     cx,256
  478. initpal1:
  479.     mov     al,cl
  480.     shr     al,2
  481.     mov     pal2[bx+0],0        ;red
  482.     mov     pal2[bx+1],al       ;green
  483.     mov     pal2[bx+2],0        ;blue
  484.     mov     pal3[bx],al       ;help entry
  485.     add     bx,3
  486.     loop    initpal1
  487.     ret
  488.  
  489. InitPalette ENDP
  490. ;--------------------------------------------------
  491. DrawPoints      PROC
  492.  
  493.  
  494.     xor     ecx,ecx
  495.     mov     cx,dispptr
  496.     mov     word ptr gs:[ecx],0
  497.     mov     word ptr gs:[ecx+(2*MaxPts)],0
  498.     mov     word ptr gs:[ecx+(4*MaxPts)],0
  499.     mov     word ptr gs:[ecx+(6*MaxPts)],0
  500.  
  501.     mov     ecx,12*(MaxPts-1)
  502. dpts1:
  503.     push    ecx
  504.     mov     eax,sphere[ecx]
  505.     sub     eax,eyeposX
  506.     mov     Xtmp,eax
  507.  
  508.     mov     eax,sphere[ecx+4]
  509.     sub     eax,eyeposY
  510.     mov     Ytmp,eax
  511.  
  512.     mov     eax,sphere[ecx+8]
  513.     sub     eax,eyeposZ
  514.     mov     Ztmp,eax
  515.  
  516.     mov     si,offset Xtmp
  517.     Call    RotateY
  518.     mov     Xtmp,ebx
  519.     mov     Ztmp,ecx
  520.  
  521.     Call    RotateX
  522.     mov     Ytmp,ebx
  523.     mov     Ztmp,ecx
  524.  
  525.     cmp     ecx,65536       ;ignore points with Z<1
  526.     jl      dpts2
  527.  
  528.     mov     ebx,ecx
  529.     Call    Three2TwoD
  530.     shr     ecx,16
  531.     shr     edx,16
  532.     add     ecx,160
  533.     add     edx,120
  534.     shr     ebx,15
  535.     sub     bx,10
  536.     cmp     bx,256
  537.     jl      dpts3
  538.     mov     bl,255          ;bl - color, ecx-X, edx-Y
  539. dpts3:
  540.     mov     al,bl
  541.     Call    EnterDot
  542. dpts2:
  543.     pop     ecx
  544.     sub     ecx,12
  545.     jge     dpts1
  546.  
  547.     Call    ShootEm
  548.  
  549.     ret
  550.  
  551. DrawPoints      ENDP
  552. ;--------------------------------------------------
  553. EnterDot        PROC
  554.  
  555.     cmp     dx,[ClipMaxY]
  556.     jae     NoEnter
  557.     cmp     dx,[ClipMinY]
  558.     jb      NoEnter
  559.  
  560.     cmp     cx,[ClipMaxX]
  561.     jae     NoEnter
  562.     cmp     cx,[ClipMinX]
  563.     jb      NoEnter
  564.  
  565.     nop
  566.     mov     bx,cx
  567.     and     bx,011b
  568.     shl     bx,1
  569.     mov     bx,staroffset[bx]
  570.     mov     si,bx
  571.     shl     si,1
  572.     add     si,dispptr
  573.     add     bx,gs:[si]
  574.     inc     word ptr gs:[si]
  575.     mov     colors[bx],al
  576.     shl     bx,1
  577.     mov     si,bx
  578.     add     si,dispptr
  579.     add     si,2
  580.     shr     cx,2
  581.     xor     ebx,ebx
  582.     mov     bx,dx
  583.     shl     bx,4
  584.     lea     ebx,[ebx+4*ebx]
  585.     add     bx,cx
  586.     add     bx,[WriteOffset]
  587.     mov     gs:[si],bx
  588.  
  589. NoEnter:
  590.     ret
  591.  
  592. EnterDot        ENDP
  593. ;--------------------------------------------------
  594. ShootEm         PROC
  595.  
  596.     nop
  597.     mov     bx,dispptr
  598.     xor     si,si
  599.  
  600.     mov     cx,gs:[bx]
  601.     or      cx,cx
  602.     jz      shoot2
  603.     add     bx,2
  604.  
  605.     mov     ax,0100h + MAP_MASK ;AL = index in SC of Map Mask reg
  606.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  607.     out     dx,ax               ; pixel's plane
  608. shoot1:
  609.     mov     al,colors[si]
  610.     mov     di,gs:[bx]
  611.     mov     es:[di],al
  612.     add     bx,2
  613.     inc     si
  614.     loop    shoot1
  615. shoot2:
  616.  
  617.     mov     bx,dispptr
  618.     add     bx,MaxPts*2
  619.     xor     si,si
  620.  
  621.     mov     cx,gs:[bx]
  622.     or      cx,cx
  623.     jz      shoot4
  624.     add     bx,2
  625.  
  626.     mov     ax,0200h + MAP_MASK ;AL = index in SC of Map Mask reg
  627.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  628.     out     dx,ax               ; pixel's plane
  629. shoot3:
  630.     mov     al,colors[si+MaxPts]
  631.     mov     di,gs:[bx]
  632.     mov     es:[di],al
  633.     add     bx,2
  634.     inc     si
  635.     ;stosb
  636.     loop    shoot3
  637. shoot4:
  638.  
  639.     mov     bx,dispptr
  640.     add     bx,MaxPts*4
  641.     xor     si,si
  642.  
  643.     mov     cx,gs:[bx]
  644.     or      cx,cx
  645.     jz      shoot6
  646.     add     bx,2
  647.  
  648.     mov     ax,0400h + MAP_MASK ;AL = index in SC of Map Mask reg
  649.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  650.     out     dx,ax               ; pixel's plane
  651. shoot5:
  652.     mov     al,colors[si+2*MaxPts]
  653.     mov     di,gs:[bx]
  654.     mov     es:[di],al
  655.     add     bx,2
  656.     inc     si
  657.     ;stosb
  658.     loop    shoot5
  659. shoot6:
  660.  
  661.     mov     bx,dispptr
  662.     add     bx,MaxPts*6
  663.     xor     si,si
  664.  
  665.     mov     cx,gs:[bx]
  666.     or      cx,cx
  667.     jz      shoot8
  668.     add     bx,2
  669.  
  670.     mov     ax,0800h + MAP_MASK ;AL = index in SC of Map Mask reg
  671.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  672.     out     dx,ax               ; pixel's plane
  673. shoot7:
  674.     mov     al,colors[si+3*MaxPts]
  675.     mov     di,gs:[bx]
  676.     mov     es:[di],al
  677.     add     bx,2
  678.     inc     si
  679.     ;stosb
  680.     loop    shoot7
  681. shoot8:
  682.  
  683.     ret
  684.  
  685. ShootEm         ENDP
  686. ;--------------------------------------------------
  687. ClearPoints     PROC
  688.  
  689.     nop
  690.     mov     bx,clearptr
  691.  
  692.     mov     cx,gs:[bx]
  693.     or      cx,cx
  694.     jz      clrem2
  695.     add     bx,2
  696.  
  697.     mov     ax,0100h + MAP_MASK ;AL = index in SC of Map Mask reg
  698.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  699.     out     dx,ax               ; pixel's plane
  700. clrem1:
  701.     mov     di,gs:[bx]
  702.     mov     byte ptr es:[di], 0
  703.     add     bx,2
  704.     loop    clrem1
  705. clrem2:
  706.  
  707.     mov     bx,clearptr
  708.     add     bx,MaxPts*2
  709.  
  710.     mov     cx,gs:[bx]
  711.     or      cx,cx
  712.     jz      clrem4
  713.     add     bx,2
  714.  
  715.     mov     ax,0200h + MAP_MASK ;AL = index in SC of Map Mask reg
  716.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  717.     out     dx,ax               ; pixel's plane
  718. clrem3:
  719.     mov     di,gs:[bx]
  720.     mov     byte ptr es:[di], 0
  721.     add     bx,2
  722.     loop    clrem3
  723. clrem4:
  724.  
  725.     mov     bx,clearptr
  726.     add     bx,MaxPts*4
  727.  
  728.     mov     cx,gs:[bx]
  729.     or      cx,cx
  730.     jz      clrem6
  731.     add     bx,2
  732.  
  733.     mov     ax,0400h + MAP_MASK ;AL = index in SC of Map Mask reg
  734.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  735.     out     dx,ax               ; pixel's plane
  736. clrem5:
  737.     mov     di,gs:[bx]
  738.     mov     byte ptr es:[di], 0
  739.     add     bx,2
  740.     loop    clrem5
  741. clrem6:
  742.  
  743.     mov     bx,clearptr
  744.     add     bx,MaxPts*6
  745.  
  746.     mov     cx,gs:[bx]
  747.     or      cx,cx
  748.     jz      clrem8
  749.     add     bx,2
  750.  
  751.     mov     ax,0800h + MAP_MASK ;AL = index in SC of Map Mask reg
  752.     mov     dx,SC_INDEX         ;set the Map Mask to enable only the
  753.     out     dx,ax               ; pixel's plane
  754. clrem7:
  755.     mov     di,gs:[bx]
  756.     mov     byte ptr es:[di], 0
  757.     add     bx,2
  758.     loop    clrem7
  759. clrem8:
  760.  
  761.     ret
  762.  
  763. ClearPoints     ENDP
  764. ;--------------------------------------------------
  765. Transform1      PROC
  766.  
  767.     mov     ecx,12*(MaxPts-1)
  768. trans1:
  769.     mov     eax,deltas[ecx]
  770.     add     sphere[ecx],eax
  771.     mov     eax,deltas[ecx+4]
  772.     add     sphere[ecx+4],eax
  773.     mov     eax,deltas[ecx+8]
  774.     add     sphere[ecx+8],eax
  775.     sub     ecx,12
  776.     jge     trans1
  777.  
  778.     xor     bx,bx
  779. trans4:
  780.     mov     al,pal3[bx]
  781.     dec     al
  782.     cmp     pal2[bx],al
  783.     jge     trans2
  784.     add     pal2[bx],2
  785.     sub     pal2[bx+1],2
  786.     jmp     short trans3
  787. trans2:
  788.     inc     al
  789.     mov     pal2[bx],al
  790.     mov     pal2[bx+1],0
  791. trans3:
  792.     add     bx,3
  793.     cmp     bx,768
  794.     jl      trans4
  795.  
  796.     mov     si,offset pal2
  797.     mov     al,0
  798.     mov     cx,256
  799.     Call    SetPal
  800.  
  801.     ret
  802.  
  803. Transform1      ENDP
  804. ;--------------------------------------------------
  805. Transform2      PROC
  806.  
  807.     mov     ecx,12*(MaxPts-1)
  808. transf1:
  809.     mov     eax,deltas[ecx]
  810.     sub     sphere[ecx],eax
  811.     mov     eax,deltas[ecx+4]
  812.     sub     sphere[ecx+4],eax
  813.     mov     eax,deltas[ecx+8]
  814.     sub     sphere[ecx+8],eax
  815.     sub     ecx,12
  816.     jge     transf1
  817.  
  818.     xor     bx,bx
  819. transf4:
  820.     mov     al,pal2[bx]
  821.     sub     al,2
  822.     jb      transf2
  823.     mov     pal2[bx],al
  824.     add     pal2[bx+1],2
  825.     jmp     short transf3
  826. transf2:
  827.     mov     al,pal3[bx]
  828.     mov     pal2[bx+1],al
  829.     mov     pal2[bx],0
  830. transf3:
  831.     add     bx,3
  832.     cmp     bx,768
  833.     jl      transf4
  834.  
  835.     mov     si,offset pal2
  836.     mov     al,0
  837.     mov     cx,256
  838.     Call    SetPal
  839.  
  840.     ret
  841.  
  842. Transform2      ENDP
  843. ;--------------------------------------------------
  844. ;**************************************************
  845. END start
  846.